package com.lcm.basic.p6.finall;

import java.util.Arrays;

/**
 * @author Coder-lcm
 * @date 2021/3/31
 */
public class TestFinalReference {
    public static void main(String[] args) {
        // final修饰引用对象，只是保证他的指向的对象的内存地址不改变，对于对象本身的值（对象属性）是可以改变的
        final int[] a = {4,6,7,9};
        System.out.println(a[0]); // 4
        a[0] = 41; // 这样赋值也是合法的
        System.out.println(a[0]); // -4
        Arrays.sort(a); // 对a进行排序也是合法的
        System.out.println(a[0]); // 6
        //对a引用对象重新赋值（即指向其他内存地址）不合法
//        a = null;
        Integer a1 = new Integer(6);
        Integer a2 = Integer.valueOf(6);
        Integer a3 = Integer.valueOf(6);
        System.out.println(a1 == a2); //比较的是内存地址
        System.out.println(a1.equals(a2)); // true ，重写equals方法，数值相等就是相等
        System.out.println(a2 == a3); //比较的是内存地址
        System.out.println(a3.equals(a2)); // true ，重写equals方法，数值相等就是相等
        /**
         * 缓存池里只缓存了-128~127,因此当数值为128时，每次创建都要new Integer（128），故肯定不相等
         */
        Integer a4 = Integer.valueOf(128);
        Integer a5 = Integer.valueOf(128);
        System.out.println(a4 == a5); // false

        Integer a6 = Integer.valueOf(127);
        Integer a7 = Integer.valueOf(127);
        System.out.println("a6 == a7 :" + (a6 == a7)); // true

        int a8 = 128;
        int a9 = 128;
        System.out.println(a8 == a9); // true

        Integer a101 = 127;
        Integer a111 = 127;
        System.out.println("a101 == a111 ： " + (a101 == a111));  // true

        Integer a10 = 128;
        Integer a11 = 128;
        System.out.println("a10 == a11 ： " + (a10 == a11)); // false

        String str1 = "lcm";
        String str2 = "lcm";
        System.out.println("str1 == str2: " + str1 == str2);

        System.out.println(0 & -4294967296L);

    }
}
